package com.ssmTmp.api.util;

import com.ssmTmp.api.constant.CommonsConstant;
import com.alibaba.fastjson.JSON;

import java.lang.reflect.Field;
import java.util.Map;
import java.util.UUID;

/**
 * @author huangz
 * @date 2018/10/24 10:05
 * @Description: 公共的工具类
 */
public class CommonsUtil {

    /**
     * 得到32位uuid
     * @return
     */
    public static String getUUID(){
        String uuid = UUID.randomUUID().toString(); //获取UUID并转化为String对象
        uuid = uuid.replace(CommonsConstant.TRANSVERSE_LINE, CommonsConstant.EMPTY);//因为UUID本身为32位只是生成时多了“-”，所以将它们去点就可
        return uuid;
    }

    /**
     * 将oldValue的值复制到newValue 有的覆盖没有的不变
     * @param newValue
     * @param oldValue
     * @param <T>
     * @return
     */
    public static <T extends Object> T  copyProperties(Object oldValue,T newValue,Class<T> clazz) {
        Map<String,Object> oldMap= JSON.parseObject(JSON.toJSONString(oldValue),Map.class);
        Map<String,Object> newMap=JSON.parseObject(JSON.toJSONString(newValue),Map.class);
        newMap.putAll(oldMap);
        return JSON.parseObject(JSON.toJSONString(newMap), clazz);
    }

    /**
     * 利用反射获取对象前后修改的内容
     *
     * @param oldBean
     * @param newBean
     * @return
     */
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static String contrastObj(Object oldBean, Object newBean) {
        StringBuilder str = new StringBuilder();
        try {
            // 通过反射获取类的类类型及字段属性
            Class clazz = oldBean.getClass();
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                if ("createTime".equals(field.getName())
                        || "updateTime".equals(field.getName())
                        || "processId".equals(field.getName())) {
                    continue;
                }
                field.setAccessible(true); //设置些属性是可以访问的
                Object val_old = field.get(oldBean);//得到此属性的修改前值  
                Object val_new = field.get(newBean);//得到此属性的修改后值
                val_old = (val_old == null ? "" : val_old);
                val_new = (val_new == null ? "" : val_new);
                if (!val_old.toString().equals(val_new.toString())) {
                    str.append(field.getName() + ":" + val_new + ";原内容:" + val_old + ";");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return str.toString();
    }
}
